﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Breuken;

namespace BreukenRekenmachine
{
    public partial class BreukenRekenmachine : UserControl
    {
        private Breuk b1;
        private Breuk b2;
        private Char teken;
        private Boolean operatorused = true;
        private Boolean slashused = false;
        private Boolean begonnen = false;
        private Boolean eerstetoets = false;

        public delegate void FoutiefGebruikHandler(string message, EventArgs e);
        public event FoutiefGebruikHandler foutiefGebruik;

        public void stelFoutiefGebruikIn(String message, EventArgs e)
        {
            if (foutiefGebruik != null) foutiefGebruik(message, e);
        }

        public BreukenRekenmachine()
        {
            InitializeComponent();
        }

        private void stelBreukenIn()
        {
            try
            {
                if (!textBoxInvoer.Text.Equals(""))
                {
                    String input = textBoxInvoer.Text;
                    int teller, noemer;
                    if (input.Contains('/'))
                    {
                        String[] inputSplit = input.Split('/');
                        teller = int.Parse(inputSplit[0]);
                        noemer = int.Parse(inputSplit[1]);
                    }
                    else
                    {
                        teller = int.Parse(input);
                        noemer = 1;
                    }
                    //textBoxInvoer.Text = "";
                    if (!begonnen)
                    {
                        b1 = new Breuk(teller, noemer);
                        begonnen = true;
                    }
                    else if (operatorused)
                    {
                        b2 = new Breuk(teller, noemer);
                        b1 = doeBewerking(teken, b1, b2);
                        operatorused = false;
                    }
                }
            }
            catch (Exception ex)
            {
                //e.Cancel = true;
                MessageBox.Show("Fout formaat voor breuk!\n\nError: " + ex.ToString(), "Invoer Breuk", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                if (foutiefGebruik != null) stelFoutiefGebruikIn("Verkeerde invoer!", new CancelEventArgs());
            }
        }

        private void buttonPlus_Click(object sender, EventArgs e)
        {
            eerstetoets = false;
            teken = '+';
            operatorused = true;
            slashused = false;
            stelBreukenIn();
        }

        private void buttonMin_Click(object sender, EventArgs e)
        {
            eerstetoets = false;
            teken = '-';
            operatorused = true;
            slashused = false;
            stelBreukenIn();
        }

        private void buttonVermenigvuldig_Click(object sender, EventArgs e)
        {
            eerstetoets = false;
            teken = '*';
            operatorused = true;
            slashused = false;
            stelBreukenIn();
        }

        private void buttonDeel_Click(object sender, EventArgs e)
        {
            eerstetoets = false;
            teken = ':';
            operatorused = true;
            slashused = false;
            stelBreukenIn();
        }

        private void buttonResultaat_Click(object sender, EventArgs e)
        {
            eerstetoets = false;
            stelBreukenIn();
            teken = '=';
            begonnen = false;
            operatorused = false;
            slashused = false;
            if (radioButtonBreukRes.Checked) textBoxInvoer.Text = b1.Toon();
            else if (radioButtonDecRes.Checked) textBoxInvoer.Text = b1.ToonDecimaal(3);
        }

        private Breuk doeBewerking(Char tekenloc, Breuk b1loc, Breuk b2loc)
        {
            Breuk b = b1loc;
            switch (tekenloc)
            {
                case '+': b = b1loc + b2loc; break;
                case '-': b = b1loc - b2loc; break;
                case '*': b = b1loc * b2loc; break;
                case ':': b = b1loc / b2loc; break;
                //case '=': b = b1loc; break;
                default: MessageBox.Show("Er is een fout opgetreden"); if (foutiefGebruik != null) stelFoutiefGebruikIn("Verkeerde invoer!", new CancelEventArgs()); break;
            }
            textBoxInvoer.Text = b.Toon();
            return b;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (!eerstetoets)
            {
                eerstetoets = true;
                textBoxInvoer.Text = "";
            }
            textBoxInvoer.Text += "1";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (!eerstetoets)
            {
                eerstetoets = true;
                textBoxInvoer.Text = "";
            }
            textBoxInvoer.Text += "2";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (!eerstetoets)
            {
                eerstetoets = true;
                textBoxInvoer.Text = "";
            }
            textBoxInvoer.Text += "3";
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (!eerstetoets)
            {
                eerstetoets = true;
                textBoxInvoer.Text = "";
            }
            textBoxInvoer.Text += "4";
        }

        private void button5_Click(object sender, EventArgs e)
        {
            if (!eerstetoets)
            {
                eerstetoets = true;
                textBoxInvoer.Text = "";
            }
            textBoxInvoer.Text += "5";
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if (!eerstetoets)
            {
                eerstetoets = true;
                textBoxInvoer.Text = "";
            }
            textBoxInvoer.Text += "6";
        }

        private void button7_Click(object sender, EventArgs e)
        {
            if (!eerstetoets)
            {
                eerstetoets = true;
                textBoxInvoer.Text = "";
            }
            textBoxInvoer.Text += "7";
        }

        private void button8_Click(object sender, EventArgs e)
        {
            if (!eerstetoets)
            {
                eerstetoets = true;
                textBoxInvoer.Text = "";
            }
            textBoxInvoer.Text += "8";
        }

        private void button9_Click(object sender, EventArgs e)
        {
            if (!eerstetoets)
            {
                eerstetoets = true;
                textBoxInvoer.Text = "";
            }
            textBoxInvoer.Text += "9";
        }

        private void button0_Click(object sender, EventArgs e)
        {
            if (!eerstetoets)
            {
                eerstetoets = true;
                textBoxInvoer.Text = "";
            }
            textBoxInvoer.Text += "0";
        }

        private void buttonSlash_Click(object sender, EventArgs e)
        {
            if (!slashused)
            {
                textBoxInvoer.Text += "/";
                slashused = true;
            }
            else MessageBox.Show("Er is een fout opgetreden");
        }

        private void buttonC_Click(object sender, EventArgs e)
        {
            operatorused = true;
            slashused = false;
            begonnen = false;
            textBoxInvoer.Text = "";
        }

        private void radioButtonBreukRes_CheckedChanged(object sender, EventArgs e)
        {
            if (!begonnen && !operatorused)textBoxInvoer.Text = b1.Toon();
        }

        private void radioButtonDecRes_CheckedChanged(object sender, EventArgs e)
        {
            if (!begonnen && !operatorused) textBoxInvoer.Text = b1.ToonDecimaal(3);
        }
    }
}
